from typing import TypedDict, Annotated

from langchain_core.messages import AnyMessage
from langgraph.graph import add_messages

"""
1.TypedDict 是 Python 3.8+ 中引入的特性，用于定义字典结构的类型提示。它允许
    你指定字典中每个键的类型，提供更好的类型检查和 IDE 支持。
2. Annotated 是 Python 3.9+ 中的类型注解工具，用于给类型添加元数据。在这里，
    它用于给 list[AnyMessage] 类型添加额外的信息，这里指的是reducer函数add_messages。
3. add_messages 是 LangGraph 提供的一个 reducer 函数，用于合并消息列表.但是如果追加的AnyMessage，跟
    原list有相同的id，就会被替换覆盖。
"""
class SQLState(TypedDict):
    # 结构化图标icon是橙色的f
    # 在 PyCharm 的文件结构列表中，对于 TypedDict 中的键，"f" 图标通常表示字段（field）或者更准确地说是键（key）
    messages: Annotated[list[AnyMessage], add_messages]

"""
AnyMessage = Annotated[
    Union[
        Annotated[AIMessage, Tag(tag="ai")],
        Annotated[HumanMessage, Tag(tag="human")],
        Annotated[ChatMessage, Tag(tag="chat")],
        Annotated[SystemMessage, Tag(tag="system")],
        Annotated[FunctionMessage, Tag(tag="function")],
        Annotated[ToolMessage, Tag(tag="tool")],
        Annotated[AIMessageChunk, Tag(tag="AIMessageChunk")],
        Annotated[HumanMessageChunk, Tag(tag="HumanMessageChunk")],
        Annotated[ChatMessageChunk, Tag(tag="ChatMessageChunk")],
        Annotated[SystemMessageChunk, Tag(tag="SystemMessageChunk")],
        Annotated[FunctionMessageChunk, Tag(tag="FunctionMessageChunk")],
        Annotated[ToolMessageChunk, Tag(tag="ToolMessageChunk")],
    ],
    Field(discriminator=Discriminator(_get_type)),
]
1. Union 部分 包含所有可能得消息类型。一种是完整消息类型；另一种消息快类型（用于流式传输）。
2. Tag为每种消息类型添加标签，在序列化/反序列化时区分不同类型的消息。
3. Discriminator(_get_type) 指定使用 _get_type 函数来确定对象的具体类型
这种设计模式使得 LangChain 能够灵活处理各种消息类型，同时保持类型安全和良好的开发体验。
"""

# FAQ: 结构中的图标
"""
PyCharm 中常见的结构视图图标还包括：
"m"：普通方法（method），类的内部第一个参数通常是 self（实例方法）或 cls（类方法），静态方法可为空
"v"：变量（variable）
红色的"f"：函数（function） 表示独立的函数（Function），定义在类外部
橙色的"f"： field字段的含义
"c"：类（class）
"i"：导入语句（import）
"p" 图标：代表 Python 中的 @property 装饰器修饰的方法,这表示该方法是一个只读属性，可以通过点号访问但不需要括号调用
这种图标设计帮助开发者快速识别代码元素的类型，提高代码导航和理解效率。
 
1.锁图标（🔒）：表示私有成员：以双下划线 __ 开头的成员（Python 中的私有约定）；
    受保护成员：以单下划线 _ 开头的成员（Python 中的受保护约定）
2. 蓝点图标：表示被覆盖（overridden）或实现（implemented）的成员
3. 斜体文本：表示继承的成员
4. 不同颜色：表示不同的访问级别或状态
 
"""